package com.flyco.modules.sync.controller;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.flyco.common.api.vo.Result;
import com.flyco.common.aspect.annotation.AutoLog;
import com.flyco.common.system.base.controller.BaseController;
import com.flyco.modules.stm.service.IStmChannelPriceService;
import com.flyco.modules.sync.entity.SysSyncDataConfig;
import com.flyco.modules.sync.entity.SysSyncDataConfigBack;
import com.flyco.modules.sync.service.ISysSyncDataConfigBackService;
import com.flyco.modules.sync.service.ISysSyncDataConfigService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @Description: 同步数据配置
 * @Author: flyco
 * @Date:   2023-08-07
 * @Version: V1.0
 */
@Slf4j
@Api(tags="同步数据配置")
@RestController
@RequestMapping("/f/sync/sysSyncData")
public class SysSyncDataConfigController extends BaseController<SysSyncDataConfig, ISysSyncDataConfigService> {
	@Autowired
	private ISysSyncDataConfigService sysSyncDataConfigService;
	@Autowired
	 private ISysSyncDataConfigBackService syncDataConfigBackService;
	@Autowired
	private IStmChannelPriceService stmChannelProductJdService;



	/**
	 * 通用方法
	 * 所有的手动同步，都在这里统一分配
	 * 触发时，使sys_sync_data_config的version自增1。前提是，判断sys_sync_data_config_back表的sync_version==operate_version（不等时说明同步进行中，不需要再次同步）
	 * dp把sys_sync_data_config的version同步到中间库的sys_sync_data_config
	 * 中间库的version和sync_version不等时，触发同步金蝶的操作，同步完成后，sync_version更新成和version一致
	 * dp把中间库的sync_version同步到sys_sync_data_config_back表的sync_version
	 * 当sys_sync_data_config_back中的sync_version和operate_version不一致时，触发江心后台的刷新操作，刷新完成时，operate_version更新成和sync_version一致
	 *
	 * type含义：
	 * 		getPrice 同步价格
	 * 		pushStoreInfo 同步经销商
	 * 		getSku 同步商品
	 * 		getSales 同步销售
	 * 		getStock 同步库存
	 * 		getUnit 同步单位
	 *
	 */
	@AutoLog(value = "触发数据同步")
	@ApiOperation(value="触发数据同步", notes="触发数据同步")
	@GetMapping(value = "/syncData/{bizCode}")
	public Result<?> syncData(@PathVariable("bizCode") String bizCode) {
		List<SysSyncDataConfigBack> list = syncDataConfigBackService.list();
		SysSyncDataConfigBack sysSyncDataConfigBack = list.stream().filter(q -> Objects.equals(q.getBizCode(), bizCode)).findFirst().orElse(null);
		if(sysSyncDataConfigBack==null){
			return Result.fail("不支持的类型："+bizCode);
		}
		if(!Objects.equals(sysSyncDataConfigBack.getSyncVersion(),sysSyncDataConfigBack.getOperateVersion())){
			return Result.fail("同步进行中，请点击“查询同步结果”进行确认");
		}

		//对比版本号
		SysSyncDataConfig config = sysSyncDataConfigService.getById(sysSyncDataConfigBack.getId());
		if(!Objects.equals(config.getVersion(),sysSyncDataConfigBack.getOperateVersion())){
			return Result.fail("同步进行中，正在同步金蝶数据，大约2分钟");
		}

		//版本号增加
		sysSyncDataConfigService.addVersion(bizCode);
		return Result.fail("提交成功，再次点击可查询最新进展情况");
	}

	/**
	 * 定时任务处理数据同步，每分钟一次
	 * 判断sys_sync_data_config_back中的sync_version和operate_version不一致时，等待10分钟后，做数据刷新操作
	 */
	@AutoLog(value = "定时任务处理数据同步，每分钟一次")
	@ApiOperation(value="定时任务处理数据同步，每分钟一次", notes="定时任务处理数据同步，每分钟一次")
	@GetMapping(value = "/syncDataFlush")
	public Result<?> syncDataFlush() {
		List<SysSyncDataConfigBack> list = syncDataConfigBackService.list();
		List<SysSyncDataConfigBack> collect = list.stream().filter(q -> !Objects.equals(q.getSyncVersion(), q.getOperateVersion())).collect(Collectors.toList());
		if(collect.isEmpty()){
			return Result.ok("没有待处理的同步任务，请点击“手动同步金蝶价格”来发起同步!");
		}
		//目前只处理价格刷新
		SysSyncDataConfigBack back = collect.stream().filter(q -> Objects.equals(q.getBizCode(), "getPrice")).findFirst().orElse(null);
		if(back==null){
			return Result.ok("没有待处理的价格同步任务!");
		}
		Date date = new Date();
		//距离处理完成时间超过10分钟，再处理
		DateTime dateTime = DateUtil.offsetMinute(date, -10);
		if(DateUtil.compare(dateTime,back.getCreateTime())<0){
			long between = DateUtil.between(back.getCreateTime(), dateTime, DateUnit.MINUTE);
			return Result.ok("数据传输中，剩余"+between+"分钟，再次点击可查询最新进展情况");
		}

		//调用价格刷新
		stmChannelProductJdService.setChannelPrice();

		//同步状态更新
		back.setOperateVersion(back.getSyncVersion());
		back.setOperateTime(date);
		syncDataConfigBackService.updateById(back);

		return Result.ok("价格刷新成功!");
	}


}
